前言
git是一个很神奇的工具,是由Linux的发起者linus用c语言编写的…
最常用的其实只有十几个命令,其他的可以等到真正的团队合作的时候去复习一下。
在这里记录一下常用命令,想要学习git推荐廖雪峰的Git教程
状态图
安装git
基本操作
1 | git #检测是否已安装git |
常用(创建项目时)
1 | 第一次在新电脑创建项目,需要添加res公钥到github |
git常用命令
创建版本库
1
2
3
4mkdir mygit
cd mygit
git init
ll #可以发现多了一个.git目录添加到暂存区
1
2
3
4
5git add readme.txt
git add . #提交新文件和修改的文件,不提交被删除的文件
git add -u #提交修改的和被删除的文件,不提交新文件
git add -A #提交所有的变化
ps:git 2.0中git add .改成提交所有变化了提交到仓库
1
2git commit -m "this is a readme file"
-m message查看工作状态
1
git status
查看修改内容
1
git diff
切换版本
1
2git reset --hard commit_id
HEAD是当前版本查看提交历史
1
2
3
4
5
6
7git log
git reflog #查看命令历史,可以用于重返未来
git log --graph #查看分支合并图
git log --graph --pretty=oneline --abbrev-commit #查看详细log
终极版:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg #查看效果撤销工作区的修改
1
2git checkout -- readme.txt
工作区的修改会被还原,还原成暂存区的内容还原暂存区的内容(用HEAD版本的内容)
1
git reset HEAD readme.txt
从版本库中删除文件
1
2git rm test.txt
git commit -m "remove test.txt"
远程库管理
关联远程库
1
2git remote add origin git@github.com:xxxxx/xxxxx
origin是远程库的名字将本地库推送到远程库
1
2
3
4
5
6git push -u origin master
从本地的master推送到远程的origin
第一次clone或push可能会有ssh警告
第一次需要添加-u参数,以后可以直接
git push origin master
git push origin new_branch #推送new_branch分支到远程库克隆远程库
1
2cd moumulu
git clone git@github.com:xxxx/xxxx将远程库合并到本地
1
2
3git pull
如果提示no tracking information,说明本地分支与远程分支连接没有创建,使用:
git branch --set-upstream-to <branchname> origin/<branchname>查看远程库信息
1
2git remote
git remote -v删除远程库文件或目录
1
2
3git rm -r --cached path
git commit -m "delete remote file"
git push
分支管理
查看当前分支
1
git branch
创建分支
1
2
3
4git checkout -b newbranch
-b 表示创建并切换,相当于
git branch newbranch
git checkout newbranch根据远程分支创建本地分支
1
git checkout -b abc origin/abc #abc为分支名(注意这里要创建相同的名字,不然推送的时候会失败)
推送本地分支到远程
1
git push origin localbranch:remotebranch
修改分支名
1
git branch -m old_branch new_branch
切换分支
1
git checkout branchname
合并分支到当前分支
1
2
3
4
5git checkout master #切换到master分支
git merge branchname #将branchname合并到当前分支
建议用:
git merge --no-ff -m "blabla..." branchname
这样不使用快速合并,可以在log里保留记录删除分支
1
2git branch -d branchname
git branch #查看使用rebase修改“基版本”(rebase命令会改变历史,建议只在个人分支使用)
1
2
3
4# 当基于master版本创建新分支b1并进行了修改后,master版本已经发生了变化,此时使用rebase将b1的基版本改为master的最新版本。
git checkout b1
git rebase master
# 如果发生冲突,手动解决后需要执行 git rebase --continue使用rebase合并多个提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26git rebase -i [startpoint] [endpoint]
# -i 的意思是 --interactive,即弹出交互式的界面让用户编辑完成合并操作
# startpoint 和 endpoint 指定了一个左开右闭区间,startpoint会被保留
# 如果不指定endpoint,则该区间的终点endpoint默认是当前分支HEAD所指向的提交
# 也可用该命令合并最近n个提交git rebase -i HEAD~n
# 之后弹出窗口让修改合并方式
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
# 一般使用如下方式将后面提交都合并到第一个提交上。
pick 85697ee This is first commit.
squash ee461c1 This is second commit.
squash 326e415 This is third commit.
# 此时处在一个临时分支上,可创建新分支
git checkout -b newbranch
# 若发生冲突可解决冲突后,使用如下命令继续或终止rebase操作。
git rebase --continue
git rebase --abort使用cherry-pick将提交应用到其他分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20git cherry-pick hash #将某次提交应用到当前分支
git cherry-pick hasha hashb hashc #将多次提交应用到当前分支
git cherry-pick hasha..hashb #将hasha之后,直到hashb之间的提交应用到当前分支(不包含hasha)
git cherry-pick hasha^..hashb #将hasha到hashb之间的提交应用到当前分支(包含hasha)
参数
-e,--edit #打开外部编辑器,编辑提交信息。
-n,--no-commit #只更新工作区和暂存区,不产生新的提交。
-x #在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
-s,--signoff #在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
处理冲突
# 用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。
git cherry-pick --continue
# 发生代码冲突后,放弃合并,回到操作前的样子。
git cherry-pick --abort
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
git cherry-pick --quit
模块管理
- 添加模块
1 | git submodule add https://xxxxxxx/xxx.git pathname |
- 克隆项目和submodule
1
2
3git clone https://xxx/xxx.git
git submodule init
git submodule update
或用一句搞定1
git clone --recursive https://xxx/xxx.git
标签管理
查看标签
1
git tag
添加标签
1
2git checkout branchname
git tag <tagname>对某次提交打标签
1
2
3
4git tag v0.9 a3k9359
git tag -a v0.1 -m "version v0.1 released" a3k9359
-a 指定标签名
-m 添加注释查看标签信息
1
git show <tagname>
删除标签
1
git tag -d v0.1
推送某标签到远程
1
git push origin v1.0
删除远程标签
1
2git tag -d v0.2 #先删除本地标签
git push origin :refs/tags/v0.2 #删除远程标签
自定义git
忽略特殊文件
1
2
3根目录下新建 .gitignore 文件,写入文件名或.exe等类型
git add -f a.exe #强制添加到git
git check-ignore -v a.exe #检查规则配置文件
1
.git/config #配置文件存放地
问题记录
有时候因为本地修改的太乱了,想直接用远程库替换本地的库可以使用下面两条命令
1
2git fetch --all #用远程库还原本地版本库
git reset --hard origin/master #用origin/master版本库内容还原暂存库当改乱了工作区内容时,想丢弃工作区的修改 git checkout – file
- 当改乱了文件,并且添加到了暂存区,先git reset HEAD
,再用git checkout – file - 当改乱了之后,并且提交到了本地版本库,使用git reset –hard 版本号 可以在各个版本之间穿梭
- git中的check out,主要有以下两个功能:
1.创建、切换分支。
2.用暂存区或版本区的内容恢复到工作区。
具体使用方法可查看蚂蚁部落教程。 不小心提交了没用的文件到远程库
1
2
3
4
5git rm -r --cached test/a.txt // 删除test文件夹下的a.txt文件,加入到删除缓存中
git commit -m '删除test文件夹下的a.txt文件' // 执行删除缓存,提交文字为“删除test文件夹下的a.txt文件”
git rm -r --cached test // 删除test文件夹,加入到删除缓存中
git commit -m '删除test文件夹' // 执行删除缓存,提交文字为“删除test文件夹”
git push // 推送操作到远程仓库每次add之前git status查看修改了哪些文件,每次只add修改过的文件,可以防止提交了无用的文件
需要回退版本
1
2git log 或者 git reflog
git reset --hard <commit_id> 或者 git reset --hard HEAD@{x}只恢复某个文件
1
2git checkout b284c80c2648f886267ea76348ca7981db8cc test/test.txt
git checkout commit filepath暂时储藏当前的修改
1
2
3
4
5
6
7
8
9
10有时候你改了一些文件,但此时想要切换到别的分支上工作,此时是无法切换成功的。
这时候就需要下面这条命令:
git stash #将当前修改暂时储藏起来
git stash pop 或者 git stash apply 将上次的储藏恢复
或者也可以这样:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash apply stash@{2}git diff
1
2
3
4
5
6$ git diff #(1)
$ git diff --cached #(2)
$ git diff HEAD #(3)
1.工作树中的更改尚未分段进行下一次提交。
2.索引和最后一次提交之间的变化; 查看已经git add ,但没有git commit 的改动。
3.自上次提交以来工作树中的更改;如果运行“git commit -a”,查看将会提交什么。抛弃所有改变,同步到最新远程库
1
2
3
4
5
6
7git强制覆盖本地代码:
git fetch --all
git reset --hard origin/master
git pull
或(慎用)
git fetch --all && git reset --hard origin/master && git pull
参考
欢迎与我分享你的看法。
转载请注明出处:http://taowusheng.cn/